package com.redhat.auth.application;

import java.util.List;

import com.redhat.auth.domain.Account;
import com.redhat.auth.domain.BizSystem;
import com.redhat.auth.domain.BizSystemBinding;

/**
 * 
 * @author lingen.liu
 * Account 的 application
 */
public interface AccountApplication {

	/**
	 * 新增或修改一个account实体
	 * @param account
	 */
	public void update(Account account);
	
	/**
	 * 新增一个account实体
	 * @param account
	 */
	public void add(Account account);
	
	/**
	 * 锁定一个帐号
	 * @param account
	 */
	public void lock(Account account);
	
	/**
	 * 解锁一个帐号
	 * @param account
	 */
	public void unLock(Account account);
	
	
	
	/**
	 * 通过ID获取一个Account实体
	 * @param id
	 * @return
	 */
	public Account getAccount(long id);
	
	public Account getAccount(String username);
	
	/**
	 * 根据名称查询帐号是否存在
	 * @param username
	 * @return
	 */
	public boolean isAccountExistsByName(String username);
	
	/**
	 * 根据帐号Email查询帐号是否存在
	 * @param email
	 * @return
	 */
	public boolean isAccountExistsByEmail(String email);
	
	/**
	 * 将一个帐号同多个系统绑定起来
	 * @param accountId
	 * @param systemIds
	 * @return
	 */
	public void accountBindSystems(long accountId,String[] systemIds);
	
	/**
	 * 将一个帐号同多个系统解除绑定
	 * @param accountId
	 * @param systemIds
	 */
	public void accountUnBindSystem(long accountId,String[] systemIds);
	
	
	/**
	 * 设置一个帐号和一个系统的绑定状态
	 * @param accontId
	 * @param systemId
	 * @param status
	 */
	public void setBizSystemBindingStatus(long accontId,long systemId,BizSystemBinding.Status status);
	
	
	/**
	 * 将一个系统同多个帐号进行绑定
	 * @param systemId
	 * @param accountIds
	 */
	public void systemBindAccount(long systemId,String[] accountIds);
	
	/**
	 * 解除一个系统同多个帐号之间的绑定
	 * @param systemId
	 * @param accountIds
	 */
	public void systemUnBindAccount(long systemId,String[] accountIds);
	
	
	/**
	 * 查出所有的accounts
	 * @param search
	 * @param page
	 * @param pageSize
	 * @return
	 */
	List<Account> listAcounts(Account search, int page, int pageSize);
	
	/**
	 * 根据一个系统ID联动的查询出相应的Account
	 * @param search
	 * @param page
	 * @param pageSize
	 * @return
	 */
	List<Account> listAccountBySystemId(Account search, int page, int pageSize);
	
	/**
	 * 获取一个系统，查询出所有未包含此系统的Account
	 * @param search
	 * @param page
	 * @param pageSize
	 * @return
	 */
	List<Account> listAccountNotContainsSystemId(Account search, int page, int pageSize);
	
	
	/**
	 * 传入accountId时，返回所有此ID未绑定的BizSystem
	 */
	List<BizSystem> listBizSystemNotBindingAccount(Account search, int page, int pageSize);
	
	
}
